<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // 关于变量提升的区别
    // console.log(a);
    // console.log(b); //报错: Cannot access 'b' before initialization (初始化前无法访问“b”)


    // 变量提升(预编译时执行 => 把变量声明提升到当前作用域的最前面)

    // let const  => ES6 新增声明变量的方式

    // 共同点:
    // 都是用于声明变量的关键词   

    // 不同点:
    // 1. var声明的变量有变量提升,let const声明的变量没有变量提升(先声明 再使用)
    // 2. var声明的变量可以重新声明, let const声明的变量不能重新声明 
    // 3. var let声明的变量可以重新赋值, const声明的常数变量(常量),已经声明无法对该变量重新赋值
    // 4. ES6新增块级作用域, 块级作用域中 let const声明的变量是局部的, 块级作用域对var没有影响

    var a = 10;
    let b = 20;
    const c = 30;
    console.log(a, b, c);

    // 关于重新声明的区别
    // var a = 100;
    // let b = 200;  // 报错: Identifier 'b' has already been declared (标识符“b”已声明)
    // let c = 300;
    // console.log(a, b, c);

    // 关于重新赋值的问题
    // a = 100;
    // b = 200;
    // c = 300; // 报错: Assignment to constant variable.(不能给常数变量赋值)
    // console.log(a, b, c);









</script>

</html>